package com.ztr.conversion.doc2docx;

import com.aspose.words.Document;
import com.aspose.words.SaveFormat;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;

/**
 * <p>
 * Doc 转 Docx 工具类
 * </p>
 */
@Slf4j
public class Doc2DocxUtil {

    /**
     * 将DOC格式的字节流转换为DOCX格式的字节流。
     * <p>
     * 该方法通过Aspose Words库实现DOC到DOCX的转换。它接收DOC文件的字节码作为输入，
     * 然后使用Aspose Words创建一个Document对象，该对象从输入字节码中加载DOC文档。
     * 最后，将转换后的DOCX文档保存到ByteArrayOutputStream中，并返回其字节码。
     *
     * @param docBytes DOC文件的字节码。
     * @return DOCX文件的字节码。
     * @throws Exception 如果转换过程中发生任何错误。
     */
    @SneakyThrows(Exception.class)
    public static byte[] docBytes2DocxBytes(byte[] docBytes) {
        // 使用输入字节流创建一个Document对象
        Document document = new Document(new ByteArrayInputStream(docBytes));
        // 创建一个ByteArrayOutputStream以保存转换后的DOCX文档
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
        // 将文档保存为DOCX格式，输出到ByteArrayOutputStream
        document.save(outputStream, SaveFormat.DOCX);
        // 返回转换后的DOCX文档的字节码
        return outputStream.toByteArray();
    }


    /**
     * 将DOC格式的字节流转换为DOCX格式的文件。
     * 此方法通过创建一个临时的DOC文档，然后将其保存为DOCX格式来实现转换。
     * 主要用于处理那些需要以DOCX格式存在的DOC文件。
     *
     * @param docBytes     DOC文件的字节流形式。
     * @param docxFilePath 转换后DOCX文件的保存路径。
     * @return 返回转换后的DOCX文件对象。
     * @throws Exception 如果转换过程中发生错误，则抛出异常。
     */
    @SneakyThrows(Exception.class)
    public static File docBytes2DocxFile(byte[] docBytes, String docxFilePath) {
        // 根据DOC字节流创建文档对象
        Document document = new Document(new ByteArrayInputStream(docBytes));
        // 将文档保存为DOCX格式到指定路径
        document.save(docxFilePath, SaveFormat.DOCX);
        // 返回转换后的DOCX文件对象
        return new File(docxFilePath);
    }


    /**
     * 将DOC格式的文档转换为DOCX格式。
     * <p>
     * 此方法通过使用Aspose Words库来实现DOC到DOCX的转换。
     * 它接受原始DOC文件的路径，生成的DOCX文件的路径，然后执行转换。
     *
     * @param fileRootPath    文件根路径，用于构建原始DOC文件和目标DOCX文件的路径。
     * @param wordFileName    原始DOC文件的名称。
     * @param wordFileNameNew 生成的DOCX文件的新名称。
     * @return 返回生成的DOCX文件的完整路径。
     * @throws Exception 如果转换过程中发生任何错误，将抛出异常。
     */
    @SneakyThrows(Exception.class)
    public static String docBytes2DocxFile(String fileRootPath, String wordFileName, String wordFileNameNew) {
        // 构建原始DOC文件和目标DOCX文件的完整路径
        // word 文件路径
        final String wordFilePath = fileRootPath + "/" + wordFileName;
        final String wordFilePathNew = fileRootPath + "/" + wordFileNameNew;

        // 创建一个Document对象，使用原始DOC文件路径作为参数
        // 将`doc`格式转换成`docx`
        Document document = new Document(wordFilePath);
        // 将Document对象保存为新的DOCX文件
        document.save(wordFilePathNew);

        // 返回生成的DOCX文件的路径
        // 返回生成的`docx`文件路径
        return wordFilePathNew;
    }


}
